package com.binc.testspring.common.lamada;

import jdk.nashorn.internal.objects.annotations.Constructor;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.apache.poi.ss.formula.functions.T;
import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author binc
 *  Comparator 比较器学习  一：SortTest： 利用comparator 实现排序
 *                      二： GroupTest 利用comparator 实现分组  （这个卸载另一个类中了）
 *
 *
 */
public class GroupTest {
    public GroupTest() {
    }

    /**
     * @author binc
     * @Description:按条件分组()
     * @param datas
     * @param c  是否为同一组的判断标准  (分组的核心逻辑其实就是比较逻辑,通过比较之后得结果来进行分组)
     * @return
     */
    public static <T> List<List<T>> divider(Collection<T> datas, Comparator<? super T> c) {
        List<List<T>> result = new ArrayList<List<T>>();
        for (T t : datas) {
            boolean isSameGroup = false;
            for (int j = 0; j < result.size(); j++) { //第一次循环的时候，result.size() = 0 不会进入循环所以不用担心下标越界
                if (c.compare(t, result.get(j).get(0)) == 0) {
                    isSameGroup = true;
                    result.get(j).add(t);
                    break;
                }
            }
            if (!isSameGroup) {
                // 创建
                List<T> innerList = new ArrayList<T>();
                result.add(innerList);  //第一个循环的时候，result的两层结构都在这里优先插入数据了
                innerList.add(t);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List<Apple> list = new ArrayList<>();
        list.add(new Apple("红", 205));
        list.add(new Apple("红", 131));
        list.add(new Apple("绿", 248));
        list.add(new Apple("绿", 153));
        list.add(new Apple("黄", 119));
        list.add(new Apple("黄", 224));
        List<List<Apple>> byColors = divider(list, new Comparator<Apple>() {

            @Override
            public int compare(Apple o1, Apple o2) {
                // 按颜色分组
                return Objects.equals(o1.color,(o2.color))?0:11; //  这里返回0（相等）  非零（不相等） 两类值就行了； 关键是divider中有个判断是否等于0的判断！！
                // return o1.color.compareTo(o2.color);//
            }
        });
        System.out.println("按颜色分组" + byColors);
        //按颜色分组[[Apple(color=红, weight=205), Apple(color=红, weight=131)], [Apple(color=绿, weight=248), Apple(color=绿, weight=153)], [Apple(color=黄, weight=119), Apple(color=黄, weight=224)]]
        // 按重量级分组[[Apple(color=红, weight=205), Apple(color=绿, weight=248), Apple(color=黄, weight=224)], [Apple(color=红, weight=131), Apple(color=绿, weight=153), Apple(color=黄, weight=119)]]
        List<List<Apple>> byWeight = divider(list, new Comparator<Apple>() {

            @Override
            public int compare(Apple o1, Apple o2) {
                // 按重量级

                return (o1.weight / 100 == o2.weight / 100) ? 0 : 1; //  这里返回0（相等）  非零（不相等） 两类值就行了； 关键是divider中有个判断是否等于0的判断！！
            }
        });
        System.out.println("按重量级分组" + byWeight);

        System.out.println("===========================================");
        Map<String, List<Apple>> collect = list.stream().collect(Collectors.groupingBy(Apple::getColor));
        System.out.println("lamada表达式，按颜色分组："+collect);
        // lamada表达式，按颜色分组：{红=[Apple(color=红, weight=205), Apple(color=红, weight=131)], 黄=[Apple(color=黄, weight=119), Apple(color=黄, weight=224)], 绿=[Apple(color=绿, weight=248), Apple(color=绿, weight=153)]}
        Map<Integer, List<Apple>> collect1 = list.stream().collect(Collectors.groupingBy(m -> m.getWeight() / 100));
        System.out.println("lamada表达式，按重量/100分组："+collect1);
        //lamada表达式，按重量/100分组：{1=[Apple(color=红, weight=131), Apple(color=绿, weight=153), Apple(color=黄, weight=119)], 2=[Apple(color=红, weight=205), Apple(color=绿, weight=248), Apple(color=黄, weight=224)]}
    }



    @Test
    public void test(){
        List<List<T>> result = new ArrayList<List<T>>();
        System.out.println(result.get(0));
        System.out.println(result.get(0).get(0));
    }


}

/*******************************下面的都是辅助代码不重要***********************************/

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
class Apple{
    public String color;
    public int weight;
}



